{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TensorFlow 2 ResNet 模型训练 \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--2020-07-05 06:43:24--  https://pinlandata.blob.core.windows.net/pinlan-data-hub/%E5%A4%96%E5%8C%85%E9%87%87%E9%9B%86/0524%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE%E9%9B%86/%E7%99%BD%E9%85%92%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE%E9%9B%860524.zip\n",
      "Resolving pinlandata.blob.core.windows.net (pinlandata.blob.core.windows.net)... 52.239.128.36\n",
      "Connecting to pinlandata.blob.core.windows.net (pinlandata.blob.core.windows.net)|52.239.128.36|:443... connected.\n",
      "HTTP request sent, awaiting response... 200 OK\n",
      "Length: 232925795 (222M) [application/zip]\n",
      "Saving to: ‘白酒分类数据集0524.zip’\n",
      "\n",
      "白酒分类数据集0524. 100%[===================>] 222.13M  4.59MB/s    in 43s     \n",
      "\n",
      "2020-07-05 06:44:07 (5.21 MB/s) - ‘白酒分类数据集0524.zip’ saved [232925795/232925795]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "!wget https://pinlandata.blob.core.windows.net/pinlan-data-hub/%E5%A4%96%E5%8C%85%E9%87%87%E9%9B%86/0524%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE%E9%9B%86/%E7%99%BD%E9%85%92%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE%E9%9B%860524.zip"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据集准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "cate = \"classified\"\n",
    "# 数据路径\n",
    "dataset_path = f\"data/{cate}\"\n",
    "# 训练集路径\n",
    "train_dataset_path = f\"{dataset_path}/train\"\n",
    "# 验证集路径\n",
    "val_dataset_path = f\"{dataset_path}/val\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 划分数据集（首次执行）\n",
    "from data_prep.dataset import Dataset\n",
    "# 训练和验证集比例\n",
    "train_ratio = 0.9\n",
    "\n",
    "data_loader = Dataset(dataset_path, train_ratio=train_ratio) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "类别总数：166\n"
     ]
    }
   ],
   "source": [
    "# 提取类别名称\n",
    "import os\n",
    "class_name = list(\n",
    "    filter(\n",
    "        lambda x: not x.startswith(\".\")\n",
    "        and os.path.isdir(os.path.join(train_dataset_path, x)),\n",
    "        os.listdir(train_dataset_path),\n",
    "    )\n",
    ")\n",
    "print(f\"类别总数：{len(class_name)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# class_name"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = \"ResNet50\"\n",
    "model_name = f\"{model}_{cate}\"\n",
    "model_path = f\"models/{model}/{model_name}.h5\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow import keras as keras\n",
    "from PIL import Image\n",
    "\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "\n",
    "keras.backend.clear_session()  # For easy reset of notebook state.\n",
    "\n",
    "gpus = tf.config.experimental.list_physical_devices('GPU')\n",
    "tf.config.set_visible_devices(devices=gpus[0], device_type=\"GPU\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras.applications import ResNet50\n",
    "\n",
    "base_model = ResNet50(include_top=False, weights='imagenet', classes=1000)\n",
    "base_model.trainable = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras.layers import Dense, GlobalAveragePooling2D\n",
    "from tensorflow.keras import Model\n",
    "\n",
    "x = base_model.output\n",
    "x = GlobalAveragePooling2D()(x) \n",
    "x = Dense(1024, activation='relu')(x) \n",
    "x = Dense(1024, activation='relu')(x) \n",
    "y = Dense(len(class_name), activation='softmax')(x) #final layer with softmax activation\n",
    "\n",
    "model = Model(inputs=base_model.input, outputs=y, name=model_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 定义优化器和损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras.optimizers import Adam\n",
    "from tensorflow.keras.metrics import categorical_crossentropy\n",
    "\n",
    "model.compile(optimizer='Adam', loss='categorical_crossentropy', metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据生成器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 7167 images belonging to 166 classes.\n",
      "Found 870 images belonging to 166 classes.\n"
     ]
    }
   ],
   "source": [
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "from tensorflow.keras.applications.mobilenet import preprocess_input\n",
    "from tensorflow.keras.preprocessing import image\n",
    "\n",
    "\n",
    "train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input)\n",
    "val_datagen=ImageDataGenerator(preprocessing_function=preprocess_input)\n",
    "\n",
    "train_generator = train_datagen.flow_from_directory(\n",
    "        train_dataset_path,\n",
    "        target_size=(224,224),\n",
    "        classes=class_name,\n",
    "        color_mode='rgb',\n",
    "        batch_size=128,\n",
    "        class_mode='categorical')\n",
    "\n",
    "val_generator = val_datagen.flow_from_directory(\n",
    "        val_dataset_path,\n",
    "        target_size=(224,224),\n",
    "        classes=class_name,\n",
    "        color_mode='rgb',\n",
    "        batch_size=128,\n",
    "        class_mode='categorical')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设置 EarlyStoping 条件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras.callbacks import EarlyStopping\n",
    "\n",
    "earlystop = EarlyStopping(monitor=\"val_loss\", patience=3, verbose=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 开始训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/20\n",
      "100/100 [==============================] - 31s 308ms/step - loss: 3.7494 - accuracy: 0.1967 - val_loss: 3.3161 - val_accuracy: 0.2488\n",
      "Epoch 2/20\n",
      "100/100 [==============================] - 29s 291ms/step - loss: 2.7425 - accuracy: 0.3536 - val_loss: 2.6917 - val_accuracy: 0.3575\n",
      "Epoch 3/20\n",
      "100/100 [==============================] - 29s 291ms/step - loss: 2.1691 - accuracy: 0.4703 - val_loss: 2.2621 - val_accuracy: 0.4553\n",
      "Epoch 4/20\n",
      "100/100 [==============================] - 29s 290ms/step - loss: 1.8078 - accuracy: 0.5400 - val_loss: 2.0283 - val_accuracy: 0.5277\n",
      "Epoch 5/20\n",
      "100/100 [==============================] - 29s 291ms/step - loss: 1.5624 - accuracy: 0.6008 - val_loss: 1.8784 - val_accuracy: 0.5694\n",
      "Epoch 6/20\n",
      "100/100 [==============================] - 29s 290ms/step - loss: 1.3243 - accuracy: 0.6553 - val_loss: 1.7838 - val_accuracy: 0.5953\n",
      "Epoch 7/20\n",
      "100/100 [==============================] - 29s 292ms/step - loss: 1.1782 - accuracy: 0.6917 - val_loss: 1.6543 - val_accuracy: 0.6172\n",
      "Epoch 8/20\n",
      "100/100 [==============================] - 29s 290ms/step - loss: 1.0470 - accuracy: 0.7249 - val_loss: 1.6053 - val_accuracy: 0.6523\n",
      "Epoch 9/20\n",
      "100/100 [==============================] - 29s 290ms/step - loss: 0.9566 - accuracy: 0.7411 - val_loss: 1.6638 - val_accuracy: 0.6026\n",
      "Epoch 10/20\n",
      "100/100 [==============================] - 29s 290ms/step - loss: 0.8435 - accuracy: 0.7712 - val_loss: 1.5223 - val_accuracy: 0.6587\n",
      "Epoch 11/20\n",
      "100/100 [==============================] - 29s 292ms/step - loss: 0.7469 - accuracy: 0.7981 - val_loss: 1.5415 - val_accuracy: 0.6645\n",
      "Epoch 12/20\n",
      "100/100 [==============================] - 29s 290ms/step - loss: 0.6802 - accuracy: 0.8124 - val_loss: 1.4288 - val_accuracy: 0.6834\n",
      "Epoch 13/20\n",
      "100/100 [==============================] - 29s 291ms/step - loss: 0.6200 - accuracy: 0.8268 - val_loss: 1.5530 - val_accuracy: 0.6759\n",
      "Epoch 14/20\n",
      "100/100 [==============================] - 29s 290ms/step - loss: 0.5734 - accuracy: 0.8403 - val_loss: 1.5426 - val_accuracy: 0.6914\n",
      "Epoch 15/20\n",
      "100/100 [==============================] - 29s 290ms/step - loss: 0.4940 - accuracy: 0.8615 - val_loss: 1.5403 - val_accuracy: 0.7089\n",
      "Epoch 00015: early stopping\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(\n",
    "        train_generator,\n",
    "        epochs=20,\n",
    "        steps_per_epoch=100,\n",
    "        validation_data=val_generator,\n",
    "        validation_steps=10,\n",
    "        callbacks=earlystop)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10/10 [==============================] - 2s 237ms/step - loss: 1.5285 - accuracy: 0.7169\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[1.5284998416900635, 0.7169058918952942]"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(\n",
    "        val_generator,\n",
    "        steps=10,\n",
    "        callbacks=earlystop,\n",
    "        verbose=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 保存模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save(model_path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 加载模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = tf.keras.models.load_model(model_path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 单张预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['一品苏黄']\n"
     ]
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "def load_image(img_path):\n",
    "    img = image.load_img(img_path, target_size=(224, 224))\n",
    "    img_tensor = image.img_to_array(img)                    \n",
    "    img_tensor = np.expand_dims(img_tensor, axis=0)         \n",
    "    img_tensor /= 255.                                      \n",
    "\n",
    "    plt.imshow(img_tensor[0])                           \n",
    "    plt.axis('off')\n",
    "    plt.show()\n",
    "\n",
    "    return img_tensor\n",
    "\n",
    "img_path = 'data/classified/val/一品苏黄/1103_18327.jpg'\n",
    "img_tensor = load_image(img_path)\n",
    "\n",
    "pred = model.predict(img_tensor)\n",
    "\n",
    "# print([[class_name[i], prob] for i, prob in enumerate(pred[0])])\n",
    "print([class_name[np.argmax(prob)] for prob in pred])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'一品苏黄'"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_name[np.argmax(pred[0])]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 批量预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras.preprocessing import image\n",
    "import numpy as np\n",
    "\n",
    "# 加载一批图像\n",
    "def load_image_list(test_dir):\n",
    "    image_tensor_list = []    \n",
    "    image_list = [os.path.join(test_dir, img_name) for img_name in os.listdir(test_dir)]\n",
    "    for image_path in image_list:\n",
    "        img = image.load_img(image_path, target_size=(224, 224))\n",
    "        img_tensor = image.img_to_array(img)                    \n",
    "        img_tensor = np.expand_dims(img_tensor, axis=0)         \n",
    "        img_tensor /= 255.\n",
    "        image_tensor_list.append(img_tensor.reshape(224,224,3))\n",
    "\n",
    "    return np.asarray(image_tensor_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['牛栏山43度珍品陈酿白酒500ml', '江小白40度JOYYOUTH500ml', '一品苏黄', '一品苏黄', '江小白40度JOYYOUTH500ml', '小郎酒45度炫彩小瓶100ml', '一品苏黄', '红星二锅头43度绵柔8陈酿500ml', '牛栏山42度陈酿白酒750ml', '一品苏黄', '一品苏黄']\n"
     ]
    }
   ],
   "source": [
    "img_list = load_image_list(\"data/classified/val/一品苏黄/\")\n",
    "preds = model.predict_on_batch(img_list)\n",
    "results = [class_name[np.argmax(prob)] for prob in preds]\n",
    "print(results)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 计算 Top-1 / Top-5 Acc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Top-1 Acc: 0.23218390804597702\n",
      "Top-5 Acc: 0.44022988505747124\n",
      "Total testing images: 870\n"
     ]
    }
   ],
   "source": [
    "top1_corrects = 0\n",
    "top5_corrects = 0\n",
    "total = 0\n",
    "\n",
    "acc = {\n",
    "    \"class_name\": class_name,\n",
    "    \"top1\": [],\n",
    "    \"top5\": [],\n",
    "}\n",
    "\n",
    "for idx, cls_name in enumerate(class_name):\n",
    "    t1, t5 = 0, 0\n",
    "    test_dir = f\"{val_dataset_path}/{cls_name}\"\n",
    "    img_list = load_image_list(test_dir)\n",
    "    if len(img_list) > 0:\n",
    "        preds = model.predict_on_batch(img_list)\n",
    "        total += len(preds)\n",
    "        for pred in preds:          \n",
    "            top_ids = pred.argsort()[-5:][::-1]\n",
    "            if idx == top_ids[0]:\n",
    "                top1_corrects += 1\n",
    "                t1 += 1\n",
    "            if idx in top_ids:\n",
    "                top5_corrects += 1\n",
    "                t5 += 1\n",
    "    acc[\"top1\"].append(t1/len(preds))\n",
    "    acc[\"top5\"].append(t5/len(preds))\n",
    "                \n",
    "print(f\"Top-1 Acc: {top1_corrects/total}\")\n",
    "print(f\"Top-5 Acc: {top5_corrects/total}\")\n",
    "print(f\"Total testing images: {total}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "166"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(class_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
